package com.sky.service.impl;

import cn.mybatis.mp.core.mybatis.mapper.context.Pager;
import cn.mybatis.mp.core.sql.executor.chain.QueryChain;
import cn.mybatis.mp.core.sql.executor.chain.UpdateChain;
import com.sky.entity.Categories;
import com.sky.mapper.CategoriesMapper;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.CategoriesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author majun
 * @package com.sky.service.impl
 * @date 2025/6/21 16:00
 */
@Service
public class CategoriesServiceImpl implements CategoriesService {

    @Autowired
    private CategoriesMapper categoriesMapper;

    /**
     * 根据id获取分类
     *
     * @param id 分类id
     * @return 分类
     */
    public Categories getCategoriesById(Long id) {
        return categoriesMapper.getById(id);
    }

    /**
     * 根据名称获取分类
     *
     * @param name 分类名称
     * @return 分类
     */
    public Categories getCategoriesByName(String name) {
        return QueryChain.of(categoriesMapper)
                .eq(Categories::getName, name)
                .get();
    }

    /**
     * 获取所有分类名称
     *
     * @return 所有分类名称
     */
    public List<String> getCategoriesNames() {
        List<Categories> categories = QueryChain.of(categoriesMapper)
                .orderBy(Categories::getSortOrder)
                .limit(7)
                .list();

        return categories.stream()
                .map(Categories::getName)
                .toList();
    }

    /**
     * 根据名称查询分类
     * @param name 分类名称
     * @return 分类名称列表
     */
    public List<String> getByNameList(String name) {

        List<Categories> categories = QueryChain.of(categoriesMapper)
                .like(Categories::getName, name)
                .ignoreEmptyInCondition(true)
                .ignoreNullValueInCondition(true)
                .trimStringInCondition(true)
                .list();

        return categories.stream()
                .map(Categories::getName)
                .toList();
    }

    /**
     * 获取所有分类列表
     *
     * @return 分类列表
     */
    @Override
    public List<Categories> getAllCategories() {
        return QueryChain.of(categoriesMapper)
                .orderBy(Categories::getSortOrder)
                .list();
    }

    /**
     * 新增分类
     *
     * @param categories 分类信息
     */
    @Override
    public void addCategory(Categories categories) {
        // 检查分类名称是否已存在
        Categories existingCategory = getCategoriesByName(categories.getName());
        if (existingCategory != null) {
            throw new RuntimeException("分类名称已存在");
        }
        
        // 如果没有设置排序，默认设置为最大值+1
        if (categories.getSortOrder() == null) {
            Categories maxCategory = QueryChain.of(categoriesMapper)
                    .orderByDesc(Categories::getSortOrder)
                    .limit(1)
                    .get();
            categories.setSortOrder(maxCategory != null && maxCategory.getSortOrder() != null ? maxCategory.getSortOrder() + 1 : 1);
        }
        
        categoriesMapper.save(categories);
    }

    /**
     * 更新分类
     *
     * @param categories 分类信息
     */
    @Override
    public void updateCategory(Categories categories) {
        // 检查分类是否存在
        Categories existingCategory = getCategoriesById(categories.getId());
        if (existingCategory == null) {
            throw new RuntimeException("分类不存在");
        }
        
        // 检查名称是否与其他分类重复
        Categories categoryWithSameName = getCategoriesByName(categories.getName());
        if (categoryWithSameName != null && !categoryWithSameName.getId().equals(categories.getId())) {
            throw new RuntimeException("分类名称已存在");
        }
        
        categoriesMapper.update(categories);
    }

    /**
     * 删除分类
     *
     * @param id 分类id
     */
    @Override
    public void deleteCategory(Long id) {
        // 检查分类是否存在
        Categories existingCategory = getCategoriesById(id);
        if (existingCategory == null) {
            throw new RuntimeException("分类不存在");
        }
        
        // TODO: 这里可以添加检查是否有关联的剧本，如果有则不允许删除
        // 可以查询ScriptTagRelations表或其他相关表
        
        categoriesMapper.deleteById(id);
    }

    /**
     * 分页查询分类
     *
     * @param name 分类名称（可选）
     * @param page 页码
     * @param pageSize 每页大小
     * @return 分页结果
     */
    @Override
    public Pager<Categories> getCategoriesPage(String name, Integer page, Integer pageSize) {
        // 构建查询条件
        QueryChain<Categories> queryChain = QueryChain.of(categoriesMapper);
        
        if (name != null && !name.trim().isEmpty()) {
            queryChain.like(Categories::getName, name);
        }
        
        // 使用Pager进行分页查询
        Pager<Categories> pager = queryChain
                .orderBy(Categories::getSortOrder)
                .paging(Pager.of(page, pageSize));
        
        return pager;
    }
} 